package org.darcy.controller.admin.site;

import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.darcy.entity.SysNotice;
import org.darcy.entity.SysUser;
import org.darcy.framework.annotation.BussinessLog;
import org.darcy.framework.blog.business.enums.NoticeStatusEnum;
import org.darcy.framework.blog.business.enums.ResponseStatus;
import org.darcy.framework.model.PageResult;
import org.darcy.framework.model.ResponseVO;
import org.darcy.framework.util.ResultUtil;
import org.darcy.framework.util.SessionUtil;
import org.darcy.model.SysNoticeModel;
import org.darcy.service.SysNoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import cn.hutool.core.util.StrUtil;

/**
 * 系统通知-- 首页菜单下方滚动显示
 */
@RestController
@RequestMapping("/notice")
public class NoticeController {
	@Autowired
	private SysNoticeService noticeService;


	@RequiresPermissions("notices")
	@PostMapping("/list")
	public PageResult list(SysNoticeModel param) {
		Page p = new Page(param.getP(), param.getPageSize());
		QueryWrapper<SysNotice> q = new QueryWrapper<SysNotice>();
		if (StrUtil.isNotEmpty(param.getTitle()))
			q.like("title", param.getTitle());
		IPage pageInfo = noticeService.getPage(p, q);
		return ResultUtil.tablePage(pageInfo);
	}

	@RequiresPermissions("notice:add")
	@PostMapping(value = "/add")
	@BussinessLog("添加公告通知")
	public ResponseVO add(SysNotice notice) {
		SysUser user = SessionUtil.getUser();
		if (null != user) {
			notice.setUserId(user.getId());
		}
		noticeService.insert(notice);
		return ResultUtil.success("系统通知添加成功");
	}

	@RequiresPermissions(value = { "notice:batchDelete", "notice:delete" }, logical = Logical.OR)
	@PostMapping(value = "/remove")
	@BussinessLog("删除公告通知")
	public ResponseVO remove(Long[] ids) {
		if (null == ids) {
			return ResultUtil.error(500, "请至少选择一条记录");
		}
		for (Long id : ids) {
			noticeService.delete(id);
		}
		return ResultUtil.success("成功删除 [" + ids.length + "] 个系统通知");
	}

	@RequiresPermissions("notice:get")
	@PostMapping("/get/{id}")
	@BussinessLog("获取公告通知详情")
	public ResponseVO get(@PathVariable Long id) {
		return ResultUtil.success(null, this.noticeService.getById(id));
	}

	@RequiresPermissions("notice:edit")
	@PostMapping("/edit")
	@BussinessLog("编辑公告通知")
	public ResponseVO edit(SysNotice notice) {
		try {
			noticeService.update(notice);
		} catch (Exception e) {
			e.printStackTrace();
			return ResultUtil.error("系统通知修改失败！");
		}
		return ResultUtil.success(ResponseStatus.SUCCESS);
	}

	@RequiresPermissions("notice:release")
	@PostMapping("/release/{id}")
	@BussinessLog("发布公告通知")
	public ResponseVO release(@PathVariable Long id) {
		try {
			SysNotice notice = new SysNotice();
			notice.setId(id);
			notice.setStatus(NoticeStatusEnum.RELEASE.toString());
			noticeService.update(notice);
		} catch (Exception e) {
			e.printStackTrace();
			return ResultUtil.error("通知发布失败，状态不变！");
		}
		return ResultUtil.success("该通知已发布，可去前台页面查看效果！");
	}

	@RequiresPermissions("notice:withdraw")
	@PostMapping("/withdraw/{id}")
	@BussinessLog("撤回公告通知")
	public ResponseVO withdraw(@PathVariable Long id) {
		try {
			SysNotice notice = new SysNotice();
			notice.setId(id);
			notice.setStatus(NoticeStatusEnum.NOT_RELEASE.toString());
			noticeService.update(notice);
		} catch (Exception e) {
			e.printStackTrace();
			return ResultUtil.error("通知撤回失败，状态不变！");
		}
		return ResultUtil.success("该通知已撤回，可修改后重新发布！");
	}

}
